package com.wjr.braveheart.adapter.recyclerView;

import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

/**
 * Created by weijinran ，Email 994425089@qq.com，on 2017/10/26.
 * Describe: RecyclerView的通用ViewHolder
 * PS: Not easy to write code, please indicate.
 */

public class ViewHolder extends RecyclerView.ViewHolder {
    //用于缓存ViewHolder中子View减少findViewById的次数
    private SparseArray<View> mViews = new SparseArray<>();

    public ViewHolder(View itemView) {
        super(itemView);
    }

    /**
     * 通过viewId获取控件
     *
     * @param viewId
     * @param <T>
     * @return
     */
    public <T extends View> T getView(int viewId) {
        //多次findViewById，对已有的View进行缓存
        View view = mViews.get(viewId);
        //使用缓存的方式减少findViewById的次数
        if (view == null) {
            view = itemView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        if (view == null) {
            throw new NullPointerException("layout中不存在该viewId = " + viewId);
        }
        return (T) view;
    }

    /**
     * 通用的功能进行封装
     * 设置点击事件
     * 采用链式调用
     *
     * @param viewId
     * @param onClickListener
     * @return
     */
    public ViewHolder setOnClickListener(int viewId, View.OnClickListener onClickListener) {
        View view = getView(viewId);
        view.setOnClickListener(onClickListener);
        return this;
    }

    /**
     * 通用的功能进行封装
     * 设置文本
     * 采用链式调用
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, CharSequence text) {
        TextView textView = getView(viewId);
        textView.setText(text);

        return this;
    }

    /**
     * 通用的功能进行封装
     * 设置图片资源
     * 采用链式调用
     *
     * @param viewId
     * @param resourceId
     * @return
     */
    public ViewHolder setImageResource(int viewId, int resourceId) {
        ImageView imageView = getView(viewId);
        imageView.setImageResource(resourceId);
        return this;
    }

    /**
     * 通用的功能进行封装 图片加载处理
     * 设置接口回调
     * 采用链式调用
     *
     * @param viewId
     * @param path
     * @param imageLoader
     * @return
     */
    public ViewHolder setImagePath(int viewId, String path, HolderImageLoader imageLoader) {
        //使用第三方网络加载框架进行封装
        ImageView imageView = getView(viewId);
        imageLoader.loadImage(imageView, path);
        return this;
    }

    /**
     * 图片的加载接口
     */
    public interface HolderImageLoader {

        /**
         * 加载图片
         *
         * @param imageView
         * @param path
         */
        void loadImage(ImageView imageView, String path);

    }
}
